import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class LeetCode104 {
    //递归实现
    public int maxDepth(TreeNode root) {
        int res = 0;
        //为空直接返回
        if (root == null) {
            return res;
        }
        if (root.left == null && root.right == null) {
            return 1;
        }
        return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }

    //非递归实现
    //层次实现
    public int maxDepth3(TreeNode root) {
        int res = 0;
        if (root == null) {
            return res;
        }

        // 初始化一个队列用于存储待处理的节点，首先将根节点加入队列。
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        // 初始化变量 level 用于记录当前层数，从 0 开始。
        int level = 0;

        // 当队列不为空时，继续循环，意味着还有层未被遍历。
        while (!queue.isEmpty()) {
            // 每进入一层新的遍历时，level 自增 1，表示进入了更深的一层。
            level++;
            // 获取当前层的节点数量。
            int size = queue.size();
            // 遍历当前层的所有节点。
            for (int i = 0; i < size; i++) {
                // 从队列中移除并获取一个节点。
                TreeNode node = queue.poll();
                // 如果当前节点有左子节点，则将其加入队列，以便在下一次循环中处理。
                if (node != null && node.left != null) {
                    queue.offer(node.left);
                }
                // 如果当前节点有右子节点，则将其加入队列，以便在下一次循环中处理。
                if (node != null && node.right != null) {
                    queue.offer(node.right);
                }
            }
        }
        // 所有层都遍历完毕后，返回 level，即树的最大深度。
        return level;
    }
}
